package varredor.web;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import varredor.concorrencia.Semaforo;

public class ConexaoBroadcast {

	private static int porta = 8000;

	private SendData SD = null;
	private ReceiveData RD = null;
	private InetAddress addrBroadcast;

	private Semaforo semaforoEnvio = new Semaforo();

	private RecebeuMensagemListener recebedor;

	//TODO Inicia a classe de conexão broadcast com o endereço de broad cast e coloca para aguardar mensagens de broad cast.
	public ConexaoBroadcast(InetAddress addrBroadcast, RecebeuMensagemListener recebedor) {
		this.addrBroadcast = addrBroadcast;
		this.recebedor = recebedor;
		RD = new ReceiveData();
		new Thread(RD).start();
	}

	public void envia(String msg) {
		SD = new SendData(msg);
		new Thread(SD).start();
	}

	public void notifica(InetAddress address, String mensagem) {
		//Teste
		//System.out.println(address+ " - " +mensagem);
		if (recebedor != null) {
			recebedor.recebeu(address, mensagem);
		}
	}

	class SendData extends Thread {

		DatagramPacket packet;
		String msg;

		public SendData(String msg) {
			this.msg = msg;
		}

		public void run() {
			System.out.println("INDO ENVIAR");
			semaforoEnvio.DOWN();
			try {
				DatagramSocket socket = new DatagramSocket();
				socket.setBroadcast(true);
				byte b[] = msg.getBytes();
				packet = new DatagramPacket(b, b.length, addrBroadcast, porta);
				socket.send(packet);
				System.out.println("MENSAGEM ENVIADA: " + msg);
				socket.close();
			} catch (Exception e) {
				e.printStackTrace();
				System.out.println("Erro em SendData: " + e.getMessage());
			}
			semaforoEnvio.UP();
			System.out.println("ENVIOU BROADCAST");
		}
	}

	class ReceiveData implements Runnable {
		DatagramPacket packet;

		public void run() {
			try {
				while (true) {
					DatagramSocket socket = new DatagramSocket(porta);
					socket.setBroadcast(true);
					byte buffer[] = new byte[64];
					packet = new DatagramPacket(buffer, buffer.length);
					socket.receive(packet);
					String data = new String(packet.getData());

					InetAddress adress = packet.getAddress();
					socket.close();
					System.out.println("MENSAGEM RECEBIDA: " + data + " IP " + adress);

					notifica(adress, data.split("§")[0]);
				}
			} catch (Exception e) {
				e.printStackTrace();
				System.out.println("ERRO EM RECEIVEDATA: " + e.getMessage());
			}
		}
	}

}
